<?xml version='1.0' encoding='iso-8859-1'?>
<!doctype html public '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3c.org/1999/xhtml' lang='en-us'>
	<head>
		<title>
			rkey.c
			</title>
		<meta http-equiv='content-type' content='text/html;iso-8859-1'/>
		<meta name='generator' content='motley-tools 1.9.4 13:40:33 Feb 18 2015'/>
		<meta name='author' content='cmaier@cmassoc.net'/>
		<meta name='robots' content='noindex,nofollow'/>
		<link href='toolkit.css' rel='stylesheet' type='text/css'/>
		</head>
	<body>
		<div class='headerlink'>
			[<a href='reword.c.html' title=' reword.c '>PREV</a>]
			[<a href='toolkit.html' title=' Index '>HOME</a>]
			[<a href='RNDPasswords.c.html' title=' RNDPasswords.c '>NEXT</a>]
			</div>
<pre>
/*====================================================================*
 *
 *   Copyright (c) 2013 Qualcomm Atheros, Inc.
 *
 *   All rights reserved.
 *
 *   Redistribution and use in source and binary forms, with or 
 *   without modification, are permitted (subject to the limitations 
 *   in the disclaimer below) provided that the following conditions 
 *   are met:
 *
 *   * Redistributions of source code must retain the above copyright 
 *     notice, this list of conditions and the following disclaimer.
 *
 *   * Redistributions in binary form must reproduce the above 
 *     copyright notice, this list of conditions and the following 
 *     disclaimer in the documentation and/or other materials 
 *     provided with the distribution.
 *
 *   * Neither the name of Qualcomm Atheros nor the names of 
 *     its contributors may be used to endorse or promote products 
 *     derived from this software without specific prior written 
 *     permission.
 *
 *   NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE 
 *   GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE 
 *   COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND ANY EXPRESS OR 
 *   IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 *   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
 *   PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 
 *   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
 *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 *   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 *   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 *   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
 *   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 *   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
 *
 *--------------------------------------------------------------------*/

/*====================================================================*
 *
 *   rkey.c - random key generator;
 *
 *   generate random SHA256, device access, network membership and
 *   network identifier keys using a seed file;
 *
 *   read the seed file, increment the seed for each key generated
 *   then save the seed when done; exit the loop in an orderly way
 *   on keyboard interrupt;
 *
 *
 *   Contributor(s);
 *	Charles Maier &lt;cmaier@qca.qualcomm.com&gt;
 *
 *--------------------------------------------------------------------*/

#define _GETOPT_H

/*====================================================================*
 *   system header files;
 *--------------------------------------------------------------------*/

#include &lt;unistd.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;limits.h&gt;
#include &lt;signal.h&gt;
#include &lt;errno.h&gt;

/*====================================================================*
 *   custom header files;
 *--------------------------------------------------------------------*/

#include &quot;../tools/getoptv.h&quot;
#include &quot;../tools/putoptv.h&quot;
#include &quot;../tools/memory.h&quot;
#include &quot;../tools/number.h&quot;
#include &quot;../tools/error.h&quot;
#include &quot;../tools/files.h&quot;
#include &quot;../tools/flags.h&quot;
#include &quot;../key/HPAVKey.h&quot;
#include &quot;../key/SHA256.h&quot;

/*====================================================================*
 *   custom source files;
 *--------------------------------------------------------------------*/

#ifndef MAKEFILE
#include &quot;../tools/getoptv.c&quot;
#include &quot;../tools/putoptv.c&quot;
#include &quot;../tools/version.c&quot;
#include &quot;../tools/uintspec.c&quot;
#include &quot;../tools/todigit.c&quot;
#include &quot;../tools/strincr.c&quot;
#include &quot;../tools/hexout.c&quot;
#include &quot;../tools/error.c&quot;
#endif

#ifndef MAKEFILE
#include &quot;../key/HPAVKeyDAK.c&quot;
#include &quot;../key/HPAVKeyNMK.c&quot;
#include &quot;../key/HPAVKeyNID.c&quot;
#include &quot;../key/HPAVKeySHA.c&quot;
#include &quot;../key/HPAVKeyOut.c&quot;
#include &quot;../key/SHA256Reset.c&quot;
#include &quot;../key/SHA256Write.c&quot;
#include &quot;../key/SHA256Block.c&quot;
#include &quot;../key/SHA256Fetch.c&quot;
#endif

/*====================================================================*
 *   program constants;
 *--------------------------------------------------------------------*/

#define DEFAULT_LEVEL 0
#define DEFAULT_COUNT 1

/*====================================================================*
 *   program variables;
 *--------------------------------------------------------------------*/

static unsigned count = DEFAULT_COUNT;

/*====================================================================*
 *
 *   void stop (signo_t signal);
 *
 *   terminate the program; we want to ensure an organized program
 *   exit such that the current pass phrase is saved;
 *
 *
 *--------------------------------------------------------------------*/

#if defined (__linux__)

static void stop (signo_t signal)

{
	count = 0;
	return;
}

#endif

/*====================================================================*
 *
 *   int main (int argc, const char * argv []);
 *
 *
 *
 *--------------------------------------------------------------------*/

int main (int argc, const char * argv [])

{
	static const char * optv [] =
	{
		&quot;DL:MNn:oqv&quot;,
		&quot;seedfile&quot;,
		&quot;generate HomePlug AV compliant keys&quot;,
		&quot;D\tDAK - Device Access Keys&quot;,
		&quot;L n\tSecurity Level is n [&quot; LITERAL (DEFAULT_LEVEL) &quot;]&quot;,
		&quot;M\tNMK - Network Membership Keys&quot;,
		&quot;N\tNID - Network Identifier&quot;,
		&quot;n n\tgenerate n keys [&quot; LITERAL (DEFAULT_COUNT) &quot;]&quot;,
		&quot;o\tuse old seedfile value&quot;,
		&quot;q\tquiet mode&quot;,
		&quot;v\tverbose mode&quot;,
		(const char *)(0)
	};

#if defined (__linux__)

	struct sigaction sa;

#endif

	char phrase [HPAVKEY_PHRASE_MAX + 1];
	uint8_t digest [SHA256_DIGEST_LENGTH];
	unsigned level = DEFAULT_LEVEL;
	signed type = 0;
	signed next = 1;
	signed fd;
	flag_t flags = (flag_t)(0);
	signed c;
	while ((c = getoptv (argc, argv, optv)) != -1)
	{
		switch ((char)(c))
		{
		case 'D':
			type = HPAVKEY_DAK;
			break;
		case 'M':
			type = HPAVKEY_NMK;
			break;
		case 'N':
			type = HPAVKEY_NID;
			break;
		case 'n':
			count = (unsigned)(uintspec (optarg, 0, UINT_MAX));
			break;
		case 'L':
			level = (unsigned)(uintspec (optarg, 0, 1));
			break;
		case 'o':
			next = 0;
			break;
		case 'q':
			_setbits (flags, HPAVKEY_SILENCE);
			break;
		case 'v':
			_setbits (flags, HPAVKEY_VERBOSE);
			break;
		default:
			break;
		}
	}
	argc -= optind;
	argv += optind;
	if (argc != 1)
	{
		error (1, ECANCELED, &quot;No secret file given&quot;);
	}
	memset (phrase, 0, sizeof (phrase));
	if ((fd = open (* argv, O_BINARY|O_CREAT|O_RDWR, FILE_FILEMODE)) == -1)
	{
		error (1, errno, &quot;Can't open %s&quot;, * argv);
	}
	if (read (fd, phrase, sizeof (phrase) - 1) == -1)
	{
		error (1, errno, &quot;Can't read seedfile&quot;);
	}
	for (c = 0; c &lt; (signed)(sizeof (phrase) - 1); c++)
	{
		if (phrase [c] &lt; HPAVKEY_CHAR_MIN)
		{
			phrase [c] = HPAVKEY_CHAR_MIN;
			continue;
		}
		if (phrase [c] &gt; HPAVKEY_CHAR_MAX)
		{
			phrase [c] = HPAVKEY_CHAR_MAX;
			continue;
		}
	}

#if defined (__linux__)

	memset (&amp;sa, 0, sizeof (struct sigaction));
	sa.sa_handler = stop;
	sigaction (SIGTERM, &amp;sa, (struct sigaction *)(0));
	sigaction (SIGQUIT, &amp;sa, (struct sigaction *)(0));
	sigaction (SIGTSTP, &amp;sa, (struct sigaction *)(0));
	sigaction (SIGINT, &amp;sa, (struct sigaction *)(0));
	sigaction (SIGHUP, &amp;sa, (struct sigaction *)(0));

#endif

	while (count-- &gt; 0)
	{
		memset (digest, 0, sizeof (digest));
		if (next &amp;&amp; strincr ((uint8_t *)(phrase), (size_t) (sizeof (phrase) - 1), HPAVKEY_CHAR_MIN, HPAVKEY_CHAR_MAX))
		{
			error (1, errno, &quot;Can't increment seedfile&quot;);
		}
		if (type == HPAVKEY_DAK)
		{
			HPAVKeyDAK (digest, phrase);
			HPAVKeyOut (digest, HPAVKEY_DAK_LEN, phrase, flags);
			continue;
		}
		if (type == HPAVKEY_NMK)
		{
			HPAVKeyNMK (digest, phrase);
			HPAVKeyOut (digest, HPAVKEY_NMK_LEN, phrase, flags);
			continue;
		}
		if (type == HPAVKEY_NID)
		{
			HPAVKeyNMK (digest, phrase);
			HPAVKeyNID (digest, digest, level);
			HPAVKeyOut (digest, HPAVKEY_NID_LEN, phrase, flags);
			continue;
		}
		HPAVKeySHA (digest, phrase);
		HPAVKeyOut (digest, HPAVKEY_SHA_LEN, phrase, flags);
	}
	if (lseek (fd, 0, SEEK_SET) == -1)
	{
		error (1, errno, &quot;Can't rewind seedfile&quot;);
	}
	if (write (fd, phrase, sizeof (phrase) - 1) == -1)
	{
		error (1, errno, &quot;Can't update seedfile&quot;);
	}
	close (fd);
	return (0);
}


</pre>
		<div class='footerlink'>
			[<a href='reword.c.html' title=' reword.c '>PREV</a>]
			[<a href='toolkit.html' title=' Index '>HOME</a>]
			[<a href='RNDPasswords.c.html' title=' RNDPasswords.c '>NEXT</a>]
			</div>
		</body>
	</html>
